# 数据序列
# 掌握字符串常用操作
import random
from runpy import run_path
from tkinter.font import names

my_str1 = 'hello world'
my_str2 = "I'm a string"
my_str3 = '''This is a multi-line string.'''
print(my_str1)
print(my_str2)
print(my_str3)

my_str4 = 'i\'m world'  # 转义字符,不然会报错
print(my_str4)

my_str5 = r'i\'m world'  # 原始字符串,不会转义
print(my_str5)

# 索引
str1 = 'abcdefg'
# 打印第一个字符
print(str1[0])
# 打印最后一个字符
print(str1[-1])
print("=====================================================")
# 越界
# print(str1[7])#string index out of range

# for循环遍历字符串
for i in str1:
    print(i, end=' ')
print()
print("=====================================================")

# while循环遍历字符串
i = 0
while i < len(str1):
    print(str1[i], end=' ')
    i += 1
print()
print("=====================================================")

# 切片
str2 = '0123456789'
# 取前5个字符
print(str2[:5])
# 取后5个字符
print(str2[-5:])
# 取第2到第5个字符
print(str2[1:5])
# 步长为2取第2到第9个字符
print(str2[1:9:2])
# 步长为-1取第9到第2个字符
print(str2[8:1:-1])
# 反转
print(str2[::-1])
print("=====================================================")

# 字符串查找
str4 = '帅哥就是真的帅'
str3 = 'kjashdfg'
# 查找字符a的位置
print(str3.find('a'))
print(str4.find('帅'))

# name="黑马程序员白马程序员"
# names=input("请输入关键词：")
# result=name.find(names)
# if result==-1:
#     print(f"没有找到关键词:{names}")
# else:
#     print(f"找到关键词{names}的位置为{result}")

# 字符串替换
str = "string replace"
print("原始字符串:", str)
print("新字符串：", str.replace("replace", "replace with", 1))
# 再次替换第二次字符串
print("再次替换第二次字符串：", str.replace("replace", "replace good", 2))

# 字符串的分割
str6 = "hello world , how are you?"
str7 = "我是一只小小饿，谁来都不怕！"
print(str6.split())
print(str6.split(","))
print(str7.split("，"))
# 根据and分割
str8 = "hello world and how are you?"
print(str8.split("and"))

# 字符串的连接
str9 = "hello"
str10 = "world"
print(str9, str10)  # 直接连接
print(str9 + " " + str10)  # 空格连接
print(' '.join([str9, str10]))  # 空格连接
print('_*_'.join(['hello', 'world']))  # 连接符连接

# 掌握列表的作用和操作方法
# 列表
# 列表是一种有序集合，可以存储多个元素，元素可以是任意类型，列表是一种可变序列。
# 方式1：类实例化
# 1.定义空列表
myList = list()
print(myList, type(myList))
# 2.非空列表（类型转换）将一种容器转换为列表，将容器中的每个数据都作为列表中的一个数据
myList2 = list("hello world")
print(myList2, type(myList2))

# 方式2：使用list()函数
# 1.定义空列表
myList = list()
print(myList, type(myList))
# 2.定义非空列表
myList3 = [1, 2, 3, 4, 5, 'hello', True]
print(myList3, type(myList3))

myList4 = [1, 2, 3, 4, 5, 'hello', True]
print(myList4[5])
print(myList4[-1])
print(myList4[0])
print(myList4[::-1])
print(myList4[::2])
print(myList4[2::])
print(myList4[:2:])

# 列表的遍历
for i in myList4:
    print(i, end=' ')
print()

# 统计列表元素个数
print(len(myList4))
myList5 = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
print(myList5.count(1))

# 列表的增加
myList4.append(6)
myList4.append("牛逼")
print(myList4)

# 列表的修改
myList4[2] = 7
myList4[4] = "牛逼"
print(myList4)

# 列表的删除
myList4.pop(2)
print(myList4)

# 练习
# 1.定义一个列表，包含10个随机整数，并输出该列表
for i in range(10):
    num = random.randint(1, 20)
    myList4.append(num)
print(myList4)
print("列表中1的个数为：", myList4.count(1))

myList4.pop(-1)  # 删除最后一个元素
print(myList4)

myList4[0] = 8  # 修改第一个元素
print(myList4)

print("表中8的个数为：", myList4.count(8))  # 统计8的个数
print("============================================")
# 列表反转，逆置
# 1.使用切片(原列表顺序不变)
print(myList4[::-1])
# 2.使用reverse()方法（列表顺序改变）
myList4.reverse()
print(myList4)
print("=========================================")

myList5 = [1, 8, 88, 9, 4, 528, 5, 8, 1, 5, 7]
# 列表的排序
# 1.使用sort()方法
# 升序
myList5.sort()
print(myList5)
# 降序
myList5.sort(reverse=True)
print(myList5)

# 列表的嵌套
myList6 = [1, 2, 3, [4, 5, 6], 7, 8, 9]
print(myList6)
print(myList6[3])
print(myList6[3][1])

myListAll = [["张三", "18", "软件测试"], ["李四", "20", "数据分析"], ["王五", "21", "大模型"]]
print(myListAll[0][0])
print(myListAll[-1][0])
for i in myListAll:
    print(i[0], i[1], i[2])

# 掌握元组的作用和操作方法
# 元组

# 方式一：定义元组
tuple1 = tuple()
print(tuple1, type(tuple1))

# 方式二：类型转换
tuple2 = (1, 2, 3, 4, 5, "hello", True, [1, 2, 3])
tuple3 = tuple([2, 3, 4, 5, 6])  # 将列表转换为元组
print(tuple2, type(tuple2))
print(tuple3, type(tuple3))

# 特殊的：定义一个数据的元组，必须在数据后面加上逗号
tuple4 = (1,)
tuple5 = (1)
print(tuple4, type(tuple4))
print(tuple5, type(tuple5))

print(tuple2[5])

# 不支持对象赋值
# tuple2[5]="world"
# print(tuple2)

# 交换两个对象的值
a = 10
b = 20
a, b = b, a
tuple6 = a, b  # 组包
print("组包后的元组：", tuple6)
a, b = tuple6  # 拆包
print("拆包后的元组：", a, b)
print("a和b的值：", a, b)
# 使用f-string格式化打印变量a和b的值
print(f"a={a},b={b}")

# 作业
# list1 = ["red", "apples", "orange", "pink", "bananas", "blue", "black", "white"]
# 判断每个词是不是e或者s结尾
list1 = ["red", "apples", "orange", "pink", "bananas", "blue", "black", "white"]
list2 = []
for i in list1:
    if i[-1] == "e" or i[-1] == "s":
        if i not in list2:
            list2.append(i)
print(list2)

# list1=input("请输入一组名字，用空格分隔：")
# names=list1.split()
# code=random.randint(0,len(names)-1)
# print(f"抽到的学生是：{names[code]}")

nums = [10, 20, 30, 40, 50]
for i in range(len(nums)):
    nums[i] = nums[i] + 10
print(nums)

# 定义一个字符串str1，字符串的内容为"hello world and itcast and itheima and Python"
# 在字符串str1中查找字符串and的下标
str1 = "hello world and itcast and itheima and Python"
print(str1.find("and"))
# 在字符串str1中查找字符串‘good'的下标
print(str1.find("good"))
# 将字符串str1中的and替换为or
sr1 = str1.replace("and", "or")
print(str1.endswith("and"))
print(str1.startswith("hello"))
# 将字符串str1按照空白字符进行切割，保存到变量1ist1中
list1 = str1.split()
print(list1)
# 将1ist1中的字符串按照逗号进行连接
str2 = ",".join(list1)
# 使用_*_将1ist1中的字符串进行连接
str3 = "_*_".join(list1)
# 使用逗号将1ist1中的字符串进行连接
str4 = ", ".join(list1)
print(str2)
print(str3)
print(str4)

# lis=[]
# while True:
#     names=input("请输入名字：")
#     if names=='':
#         break
#     else:
#         print("欢迎",names,"加入我们！")
#         lis.append(names)
# print("现在我们拥有的成员有：",lis,"中奖的是：",random.choice(lis))
